perm filename PARM.OLD[PNT,HE]2 blob
sn#496195 filedate 1980-02-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 put locations into comtab
C00005 00003 ROUTINE TO TAKE A MOVE COMMAND GIVEN IN TERMS OF A SERIES OF TRANS ADDRESSES
C00017 00004 RCENTER
C00018 00005 ROUTINE TO TAKE A DRIVE COMMAND GIVEN IN A RELATIVE OR ABSOLUTE AMOUNT
C00027 00006 FOLLOWING CONTAIN JOINT ANGLES FOR BLUE AND YELLOW ARMS AT THE NEW TRANSES
C00029 00007 ROUTINE TO READ RAW FORCE WRIST AND RETURN INFORMATION TO PDP10
C00031 ENDMK
C⊗;
;put locations into comtab
DATA
PUTLOC LRPMOVE,RPMOVE
PUTLOC LRTADRIVE,RTADRIVE
PUTLOC LRTDDRIVE,RTDDRIVE
PUTLOC LRCENTER,RCENTER
PUTLOC LRFORCE, RFORCE
PUTLOC LMECHNM,MECHNM
CODE
;gets polynomial buffer
;R0=Mechanism word
;it returns the polynomial buffer in R0
GPLYBUF:JSR PC,MECHNM ; get position of bit
DEC R0 ; reduce by 1
ASL R0 ; double it to get the position
MOV PLY(R0),R0 ; load appropriate address into R0
RTS PC
COMMENT ⊗ following routine gives the bit position from the right of the
first 1; assume at most 6 mechanisms
⊗
MECHNM: MOV R1,-(SP) ; save R1
MOV #6,R1 ; do 6 times
1$: BIT #1,R0 ; is rightmost bit on?
BNE 2$
ASR R0 ; no, shift
SOB R1,1$ ; and try again
2$: MOV #7,R0 ; yes, so complement from 7
SUB R1,R0
MOV (SP)+,R1 ; restore R1
RTS PC
DATA
PLY: .WORD YPLY,YHPLY,BPLY,BHPLY,VPLY,SPLY
THF: .WORD YTHF,YHTHF,BTHF,BHTHF,0,0
PTH: .WORD YTH,YHTH,BTH,BHTH,VTH,STH
PJTHF: .WORD YJTHF,YHTHF,BJTHF,BHTHF,VTHF,STHF
JTHO: .WORD YJTHO,YHJTHO,BJTHO,BHJTHO,VTHO,STHO
MECHN: .WORD 1,2,4,10,20,40
TMFAC: .WORD YTIMFAC,YHTIMFAC,BTIMFAC,BHTIMFAC,0,0
DARRAY: .WORD YDARRAY,0,BDARRAY,0,0,0
DDARRAY:.WORD YDDARRAY,0,BDDARRAY,0,0,0
TMARR: .WORD YTMARR,0,BTMARR,0,0,0
TMPTR: .WORD YTPTR,0,BTPTR,0,0,0
NUMSEG: .WORD 0,0,0,0,0,0,0 ;number of segments
DURVAL: .WORD YDUR,0,BDUR,0,0,0 ;total duration
UDURVAL:.WORD 0,0,0,0,0,0 ;user duration
YTMARR: .BLKW 10. ; ten addresses of times
BTMARR: .BLKW 10. ; ten addresses of times for blue arm
YDUR: .FLT2 0.0
BDUR: .FLT2 0.0
CODE
; ROUTINE TO TAKE A MOVE COMMAND GIVEN IN TERMS OF A SERIES OF TRANS ADDRESSES
;AND CONVERTING IT INTO A POLYNOMIAL COEFFICIENT FORM
;DATA LIST STRUCTURES FOR POLYNOMIAL COEFFICIENTS AND DEVICE BLOCKS
;
;THE FOLLOWING DESCRIBES THE REQUIRED ORGANIZATION FOR THE TRANS
;DATA LIST AND ASSOCIATED SERVO POINTERS:
;
; SERVO POINTERS DATA ARRAY
;
; XXXXXX TWO SERVO BIT WORDS
; XXXXXX 1 BIT FOR EACH SERVO
; BITS COMMAND MODE BITS, EG. NNUL,WOBBLE
; WOBMAG PTR TO WOBBLE MAGNITUDE CELL
; DURATION/SPEEDFACTOR *1000
; TRANS POINTER TO LIST OF END POINT
; TRANSFORMS AND VALIDITY NUMBERS
; CODE PTR TO CODE TO BE SCHEDULED THIS SEG
; TIME LENGTH OF SEGMENT IN MSECS
; OR -SPEEDFACTOR*1000
; 0 MEANS SPEEDFACTOR=1 AND NO SPECIFIED TIME
; TRANS POINTER TO LIST OF END POINT
; TRANSFORMS AND VALIDITY NUMBERS
; CODE PTR TO CODE TO BE SCHEDULED THIS SEG
; TIME LENGTH OF SEGMENT IN MILLISEC
; .
; .
; .
; .
; 0
; END OF MOVE SEGMENTS
;
;
;
; THE CALLING SEQUENCE FOR THIS ROUTINE IS THE SAME AS IN MOVE
;
; MOV #COFLST,R0 ;SET POINTER TO DATA LIST
; MOV #DEVICE,R1 ;STORAGE AREA FOR DEVICE BLOCK,33 WORDS
; ; WHICH WILL BE SAME AS THE ONE PASSED TO MOVE
; JSR PC,PMOVE
; TST R0 ;CHECK FOR ERROR CONDITION
;
;
; RPMOVE is used when position independent code is desired.
; (R4) contains the value of the interpreter program counter, and
; R0 the amount of offset in words of the coeflist [MSM 1/24/79]
;
;REGISTERS USED
; R0,R1 PASS ARGUMENTS AND THE STATE IS AS RETURNED FROM MOVE
; AC0,AC1,AC2,AC3,AC4,AC5 ARE GARBAGED
;
;
CODE
;RELATIVE DISTANCE ACROSS SEGMENTS IN POLY COEF LIST
SGTTME ==4 ;OFFSET OF TIME IN MILLISEC FOR THIS SEGMENT
SGTCDE ==2 ;OFFSET FOR CODE
SGTTRN ==0 ;OFFSET FOR TRANS
SGTNXT ==6 ;OFFSET TO NEXT SEGMENT
SEGOFF ==310 ;SPAN OF COEFFICIENTS
A4COEF ==30 ;A4 TERM OF FIRST POLYNOMIAL
; dont change value in R4;;;
RPMOVE:
PMOVE: MOV R2,-(SP) ;SAVE REGISTERS
MOV R3,-(SP)
MOV R5,-(SP)
MOV R1,-(SP)
MOV R0,R1 ; save coef list temp
MOV @(R4),R0 ;mechanism bits, actually @IPC(R4), but IPC=0
JSR PC,MECHNM ; get order of mechanism
DEC R0
ASL R0
MOV R0,R5 ; get appropriate offset in R5
MOV PLY(R5),-(SP) ; polynomial starting address in the stack
MOV (SP),-(SP) ; this used as pointer
MOV R1,-(SP) ;SAVE FOR LATER USE
; (SP)=coef list
; 2(SP)=ptr to polylist
; 4(SP)= beginning of polylist
;COPY OUT HEADER INFO FROM THE TRANS LIST
MOV #4,R3 ;COPY FIRST 4 PIECES OF HEADER INFO
MOV 2(SP),R2 ;R2=ptr to polylist
1$: MOV (R1)+,(R2)+
SOB R3,1$
MOV (R1)+,UDURVAL(R5) ; global duration
MOV R1,(SP) ;update pointers
MOV R2,2(SP)
;AT THIS POINT (SP) POINTS TO THE TRANSFORM
;2(SP) DATPT{PTR}
NXTTR0: MOV #7,R3 ;MOVE CURRENT VALUES OF JOINT ANGLES INTO
MOV PTH(R5),R2 ;BJTHF AND YJTHF
MOV PJTHF(R5),R1
1$: LDF @(R2)+,AC0
STF AC0,(R1)+
SOB R3,1$
MOV TMARR(R5),TMPTR(R5); set up pointers to array of times
CLR NUMSEG(R5) ; set up counter for number of segments
CLRF @DURVAL(R5) ; set total duration=0
NXTTRN: INC NUMSEG(R5) ;one more segment to process
MOV #7,R3 ;FIRST COPY VALUES AT BEG OF SEG INTO BJTHO
MOV JTHO(R5),R0 ;
MOV PJTHF(R5),R1 ;
1$: LDF (R1)+,AC0
STF AC0,(R0)+
SOB R3,1$
MOV @(SP),R0 ;SETUP CALL TO SOLVE
JSR PC,@LGETARG ;find the address of the transform
MOV 2(R0),R0 ;R0←LOC[trans]
MOV #THETFP,R1
MOV MECHN(R5),R2
JSR PC,SOLVE
TST R0 ;TEST AND CHECK IF SOLVE DID THE RIGHT THING
BEQ 11$
ALERR NOSOLM ;complain
TST R0
BEQ 11$ ;cleared by user, continue
MOV #NOSOLU,R0 ;ELSE SIGNAL NO ARM SOLUTION FOUND
ADD #6,SP
MOV (SP)+,R1 ;clear out stack
JMP PMDNE ; and exit cleanly
11$: LDF FM10,AC3 ;AC3←-10
LDF FM1P5,AC2
STF AC2,AC4 ;AC4←-15/10
LDF FM0P4,AC2
STF AC2,AC5 ;AC5←6/(-15)
CLRF AC2 ;USED TO STORE MAX TIME SO FAR
MOV TMFAC(R5),R1 ;USED TO GET TIME FACTORS
MOV PJTHF(R5),R2 ;R2 POINTS TO VALUES AT END OF SEGMENT
MOV 2(SP),R0 ;R0 IS A POINTER THAT OUTPUTS INDIVIDUAL COEF
ADD #A0COEF,R0 ;SET UP THE VALUE TO OUTPUT
MOV #6,R3 ;COMPUTE CHANGE IN ANGLES AND OUTPUT THE RELEVANT VALUES
2$: LDF BJTHO-BJTHF(R2),AC0
STF AC0,(R0)+ ;OUTPUT A0
CLRF (R0)+ ;OUTPUT A1
CLRF (R0)+ ;OUTPUT A2
SUBF (R2)+,AC0 ;AC0←BJTHO-BJTHF
LDF (R1)+,AC1 ;AC1 NOW HAS TIMFAC
MULF AC0,AC1 ;AC1 NOW HAS TIME TAKEN FOR THIS JOINT
ABSF AC1 ;TAKE THE ABSOLUTE VALUE
CMPF AC1,AC2 ;COMPARE THIS VALUE TO VALUE SO FAR
CFCC ;COPY FLOATING CONDITION CODES
BLT 5$ ;TIME FOR THIS JOINT SMALLER?
LDF AC1,AC2 ;NO, UPDATE AC2
5$: MULF AC3,AC0 ;AC0←A3= (BJTHF-BJTHO)*10
STF AC0,(R0)+ ;OUTPUT A3
MULF AC4,AC0 ;AC0←A4
STF AC0,(R0)+ ;OUTPUT A4
MULF AC5,AC0 ;AC0←A5
STF AC0,(R0)+ ;OUTPUT A5
SOB R3,2$
MOV (SP),R3
LDCIF SGTTME(R3),AC1 ;AC1←time in msecs or speedfactor that user wants
CFCC
BLT 6$ ; it is speed factor
MULF SPEED,AC2 ;MULTIPLY BY DEFAULT SPEED FACTOR to get our time
CMPF AC1,AC2 ; compare user time with ours
CFCC
BLT 8$ ; users is less, use ours
STF AC1,AC2 ; users is more, use his
BR 8$ ;AC2 has time in msec
6$: DIVF MM1000,AC1 ; convert to speed factor
MULF AC1,AC2 ;AC2←time
8$: STCFI AC2,R2
ADD #400.,R2 ;ADD .4 SEC SLACK TIME
CMP #600.,R2 ;COMPARE WITH .6 SEC TIME
BLT 9$
MOV #600.,R2 ;MIN TIME FOR TRAJ=.6 SEC
9$: MOV 2(SP),R3
MOV R2,SEGTME(R3) ;PUSH INTO THE POLYNOMIAL LIST
MOV #SEGOFF,(R3) ;SET UP POINTER TO NEXT SEGMENT POINTER
; MOV SGTTRN(R5),SEGTRN(R4);TRANSFER TRANS NUMBER
CLR SEGTRN(R3) ;FOR POINTY THIS IS ZERO
; MOV SGTCDE(R5),RNCODE(R4) ;RUNCODE OFFSET
CLR RNCODE(R3) ;FOR POINTY THIS IS ZERO
ADD #SEGTME,R3 ;remember pointer to the time
MOV R3,@TMPTR(R5)
ADD #2,TMPTR(R5) ; and update the pointers
LDF @DURVAL(R5),AC0 ;AC0←cumulative motion time so far
LDCIF R2,AC2 ; AC2←time for this segment
ADDF AC2,AC0 ; add current segment time
STF AC0,@DURVAL(R5) ;and update it
; GET READY TO CALL BEJCZY
MOV #6,R3 ;SETUP UP DARRAY PRIOR TO CALLING BEJCZY
MOV DARRAY(R5),R1 ;DARRAY IS TO BE SET UP WITH ADDRESSES OF
3$: MOV R0,(R1)+ ; FOLLOWING
ADD #4,R0 ;D1,D2,D3,...D6,D11,D22,D33,D44,D55,D66
MOV R0,12(R1)
ADD #4,R0
SOB R3,3$
MOV THF(R5),R0 ;PTR TO LIST OF PTRS TO JOINT ANGLES
MOV DARRAY(R5),R1 ;PTR TO LIST OF PTRS TO D(I)'S AND D(II)'S
MOV MECHN(R5),R2 ;MECHANISM BIT INDICATING DEVICE TO USE
JSR PC,DTERMS ;CALL BEJCZY ROUTINES
ADD #SEGOFF,2(SP) ;OFFSET POLYNOMIAL PTR BY RIGHT AMOUNT
ADD #SGTNXT,(SP) ;JUMP COEFLIST TO THE NEXT SEGMENT TRANS INFO
CMP @(SP),#0
BEQ 4$ ;ANY MORE TRANSES TO COMPUTE?
JMP NXTTRN ;YUP, NOT OVER YET
; now compare duration given by user with ours
4$: LDCIF UDURVAL(R5),AC0 ;AC0←user duration
CFCC
BGE 40$ ; is not speed factor, so handle accordingly
DIVF MM1000,AC0 ;AC0←speed factor
BR 401$
40$: LDF @DURVAL(R5),AC1 ;AC1←our duration
CMPF AC1,AC0
CFCC
BGT 42$ ; ours is bigger, use it
DIVF AC1,AC0 ; AC0←stretching factor
401$: MOV NUMSEG(R5),R3 ; R3←no of segments to process
MOV TMARR(R5),R2 ; R2 indexes into time list
41$: LDCIF @(R2),AC1
MULF AC0,AC1 ; AC1 is the new time
STCFI AC1,@(R2)+ ; update the time
SOB R3,41$
42$: TST (SP)+ ; Pop coef list
CLR @(SP)+ ;OUTPUT FINAL ZERO TO INDICATE NO MORE SEGMENTS
MOV (SP)+,R0 ;SETUP TO CALL MOVE
MOV (SP)+,R1 ;GET THE DEVICE BLOCK ADRESS
JSR PC,MOVE ;WAVE THE ARM
PMDNE: MOV (SP)+,R5 ;RESTORE REGISTERS
;R0,R1 WILL BE IN THE STATE IN WHICH THEY LEFT MOVE
MOV (SP)+,R3
MOV (SP)+,R2
RTS PC ;EXIT
; RCENTER
RCENTER:JMP CENTER
; ROUTINE TO TAKE A DRIVE COMMAND GIVEN IN A RELATIVE OR ABSOLUTE AMOUNT
;AND CONVERTING IT INTO A POLYNOMIAL COEFFICIENT FORM
;DATA LIST STRUCTURES FOR POLYNOMIAL COEFFICIENTS AND DEVICE BLOCKS
;
;THE FOLLOWING DESCRIBES THE REQUIRED ORGANIZATION FOR THE TRANS
;DATA LIST AND ASSOCIATED SERVO POINTERS:
;
; SERVO POINTERS DATA ARRAY
;
; XXXXXX TWO SERVO BIT WORDS
; XXXXXX 1 BIT FOR EACH SERVO
; BITS COMMAND MODE BITS, EG. NNUL,WOBBLE
; WOBMAG PTR TO WOBBLE MAGNITUDE CELL
; SAMOUNT POINTER TO A SCALAR
; CODE PTR TO CODE TO BE SCHEDULED THIS SEG
; TIME LENGTH OF SEGMENT IN MSECS
; OR -SPEEDFACTOR*1000
; 0 MEANS SPEEDFACTOR=1 AND NO SPECIFIED TIME
; 0
; END OF MOVE SEGMENTS
;
; THE CALLING SEQUENCE FOR THIS ROUTINE IS THE SAME AS IN MOVE
;
; MOV #COFLST,R0 ;SET POINTER TO DATA LIST
; MOV #DEVICE,R1 ;STORAGE AREA FOR DEVICE BLOCK,33 WORDS
; ; WHICH WILL BE SAME AS THE ONE PASSED TO MOVE
; JSR PC,TMOVE
; TST R0 ;CHECK FOR ERROR CONDITION
;
;
;REGISTERS USED
; R0,R1 PASS ARGUMENTS AND THE STATE IS AS RETURNED FROM MOVE
; AC0,AC1,AC2,AC3,AC4,AC5 ARE GARBAGED
;
;
;RELATIVE DISTANCE ACROSS SEGMENTS IN POLY COEF LIST
SGJTME ==4 ;OFFSET OF TIME IN MILLISEC FOR THIS SEGMENT
SGJCDE ==2 ;OFFSET FOR CODE
SGJTRN ==0 ;OFFSET FOR TRANS
SGJOFF ==40. ;SPAN OF COEFFICIENTS
SGJDAT ==8. ;BEGINNING OF DATA FROM COEF LIST
RTADRIVE:
; ASL R0
; ADD (R4),R0
TADRIVE: MOV #1,ABSDRV ;SET UP FIRST PART OF HEADER INFO
BR PDRIVE
RTDDRIVE:
; ASL R0
; ADD (R4),R0
TDDRIVE: MOV #0,ABSDRV
PDRIVE: MOV R2,-(SP) ;SAVE REGISTERS(1)
MOV R3,-(SP) ;(2)
MOV R4,-(SP) ;(3)
MOV R5,-(SP) ;(4)
MOV R1,-(SP) ;(5)
MOV R0,R5 ;USE R5 AS POINTER TO DATA LIST
MOV @(R4),R0 ;mechanism bits, actually @IPC(R4), but IPC=0
JSR PC,GPLYBUF ; get appropriate address in R0
MOV R0,R4 ;USE R4 AS PTR TO POLY LIST FOR MOVE
MOV R0,-(SP) ;USE R4 AS PTR TO POLY LIST FOR MOVE
MOV #4,R3 ;COPY FIRST 4 PIECES OF HEADER INFO
1$: MOV (R5)+,(R4)+
SOB R3,1$
MOV R4,-(SP) ;SAVE POINTER FOR FUTURE USE(6)
MOV (R0),R2 ;GET THE SERVO BITS TO DETERMINE # OF REQ. SRV.
MOV 2(R0),R3 ;32 POSSIBLE SERVOS
MOV #-1,R4
11$: INC R4 ;INCREMENT SERVO COUNT
ASHC #1,R2 ;GET NEXT SERVO BIT
BNE 11$ ;REPEAT TILL ALL SERVO BITS ADDED
ADD R4,R4 ;DOUBLE TO GET THE OFFSET
MOV #7,R3 ;MOVE CURRENT VALUES OF JOINT ANGLES INTO
MOV #BTH,R2 ;BJTHF AND YJTHF
MOV #BJTHF,R1
2$: LDF @(R2)+,AC0
STF AC0,(R1)+
SOB R3,2$
; LDF SGJTRN(R5),AC1 ;NEW ANGLE VALUE STATMENT NOW CHANGED
MOV SGJTRN(R5),R0
MOV R4,-(SP) ;(7)
MOV 12(SP),R4
JSR PC,@LGETARG
MOV (SP)+,R4 ;(6)
MOV 2(R0),R0 ; get address of scalar
LDF (R0),AC1 ;new angle value
LDF @THETFP(R4),AC0 ;OLD ANGLE VALUE
CMP #1,ABSDRV ;ABSOLUTE OR RELATIVE MOVE?
BEQ 13$
ADDF AC0,AC1
13$: ; AC1 now contains the final value
MOV R4,-(SP) ; save R4(7)
MOV SERVOS(R4),R4 ; R4←starting of servo data blocks
LDF USTOP(R4),AC2 ; AC0←upper limit
CMPF AC2,AC1 ;
CFCC
BGE 131$ ; less than upper limit, branch
STF AC2,AC1 ; otherwise use upper stop
BR 134$
131$: MOV (SP),R4 ;(7)
MOV SERVOS(R4),R4
LDF LSTOP(R4),AC2 ;AC0←LOWER LIMIT
CMPF AC2,AC1
CFCC
BLE 135$ ; its OK can proceed
STF AC2,AC1 ; otherwise use lower stop
134$: MOV (SP)+,R1 ; get joint no in bytes(6)
MOV R1,R4
ASR R1
INC R1
MOV #1,R0 ;
BR 1341$
1342$:: ASL R0
1341$:: SOB R1,1342$
ALERR NOSOLM ; print error message
TST R0
BEQ 136$
MOV #NOSOLU,R0
ADD #4,SP ; clean off top two elements in stack
BR DRVDNE ; exit cleanly
135$: MOV (SP)+,R4 ; (6)
136$:: STF AC1,@THETFP(R4) ;NOW WE HAVE STORED NEW JOINT VALUE IN RELEVANT SPOT
MOV #DDARRAY,R0 ;LOAD UP RELEVANT DARRAY COEF
MOV #DARRAY,R1
MOV #12.,R3
10$: MOV R0,(R1)+
ADD #4,R0
SOB R3,10$ ;DARRAY NOW CONTAINS DUMMY ARRAY
MOV (SP)+,R1 ;GET BACK POINTER TO POLYNOMIAL POSITION(5)
MOV #SGJOFF,(R1) ;OUTPUT NEXT SEGMENT POINTER
MOV #0,SEGTRN(R1) ;OUTPUT ZERO FOR TRANS NUM
MOV #0,RNCODE(R1) ;OUTPUT ZERO FOR CODES NUM
MOV SGJTME(R5),SEGTME(R1) ;
MOV #3000.,SEGTME(R1) ; give it arbitrary 3 second motion
ADD #A0COEFF,R1 ;GET POSITION OF POLYNOOMIAL
STF AC0,(R1)+ ;OUTPUT A0
CLRF (R1)+ ;A1=0
CLRF (R1)+ ;A2=0
SUBF AC1,AC0 ;AC0=OLD-NEW
MULF FM10,AC0
STF AC0,(R1)+ ;A3
MULF FM1P5,AC0 ;
STF AC0,(R1)+ ;A4
MULF FM0P4,AC0 ;
STF AC0,(R1)+ ;A5
CMP #10.,R4 ;DETERMINE DEVICE
BLT 3$
MOV #YELARM,R2 ;IS YELLOW ARM
BR 8$
3$: CMP #12.,R4
BLT 4$
MOV #YELHND,R2 ;IS YELLOW HAND
MOV R1,DARRAY
ADD #4,R1
MOV R1,DARRAY+2
BR 7$
4$: CMP #24.,R4
BLT 5$
MOV #BLUARM,R2 ;IS BLUE ARM
SUB #16,R4 ;CORRECT FOR OFFSET
BR 8$
5$: MOV #BLUHND,R2 ;IS BLUE HAND
MOV R1,DARRAY
ADD #4,R1
MOV R1,DARRAY+2
BR 7$
8$: MOV R1,DARRAY(R4)
ADD #4,R1
MOV R1,DARRAY+14(R4)
7$: CLR (R1)+
CLR (R1)+
MOV #DARRAY,R1
MOV #BTHF,R0
JSR PC,DTERMS ;MAKE A CALL TO BEJCZY
MOV (SP)+,R0 ;SETUP TO CALL MOVE
MOV (SP)+,R1 ;GET THE DEVICE BLOCK ADRESS(4)
JSR PC,MOVE ;WAVE THE ARM
DRVDNE: MOV (SP)+,R5 ;RESTORE REGISTERS(3)
MOV (SP)+,R4 ;R0,R1 WILL BE IN THE STATE IN WHICH THEY LEFT MOVE(2)
MOV (SP)+,R3 ;(1)
MOV (SP)+,R2 ;(0)
RTS PC ;EXIT
;FOLLOWING CONTAIN JOINT ANGLES FOR BLUE AND YELLOW ARMS AT THE NEW TRANSES
DATA
YBJTHF:
YJTHF: .BLKW 16
BJTHF: .BLKW 16
YJTHO: .BLKW 16
BJTHO: .BLKW 16
THETFP:
YTHF: YJTHF
YJTHF+4
YJTHF+10
YJTHF+14
YJTHF+20
YJTHF+24
YHTHF: YJTHF+30
BTHF: BJTHF
BJTHF+4
BJTHF+10
BJTHF+14
BJTHF+20
BJTHF+24
BHTHF: BJTHF+30
FM10: .FLT2 -10.0
FM1P5: .FLT2 -1.5
FM0P4: .FLT2 -0.4
BDARRAY:.BLKW 14 ;PUT POINTERS TO BEJCZY TERMS
YDARRAY:.BLKW 14 ;PUT POINTERS TO BEJCZY TERMS
BDDARRAY: .BLKW 30 ;ROOM FOR DUMMY BEJCZY COEFFS THAT ARE NOT NEEDED
YDDARRAY: .BLKW 30 ;ROOM FOR DUMMY BEJCZY COEFFS THAT ARE NOT NEEDED
MM1000: .FLT2 -1000.0
; 0.75,0.5,4.5,0.2,0.2,0.4,5.0, ! Yellow joint times FROM ARMSOL
; 0.75,0.75,4.5,0.2,0.2,0.4,5.0; ! Blue joint times IN JIF/DEG
; SO THE FOLLOWING ARE 1000/60 OF THESE VALUES TO GIVE MSEC/DEG
TIMFAC:
YTIMFAC: .FLT2 12.5
.FLT2 8.333
.FLT2 75.0
.FLT2 3.333
.FLT2 3.333
.FLT2 6.667
YHTIMFAC:.FLT2 83.333
BTIMFAC: .FLT2 12.5
.FLT2 12.5
.FLT2 75.0
.FLT2 3.333
.FLT2 3.333
.FLT2 6.667
BHTIMFAC:.FLT2 83.333
SPEED: .FLT2 1.0 ;DEFAULT SPEED FACTOR
ABSDRV: 1
BPLY: .BLKW 1000
YPLY: .BLKW 1000
BHPLY: .BLKW 100
YHPLY: .BLKW 100
VPLY: .BLKW 100
SPLY: .BLKW 100
CODE
;ROUTINE TO READ RAW FORCE WRIST AND RETURN INFORMATION TO PDP10
; copied over from old POINTY file
; note that the data sent is in integer format
;
; procedure should be called with R1 containing a pointer to
; the buffer in which the data is to be stored.
; sample call is as follows:
;
; MOV #FPPTR,R1
; JSR PC,RFORCE
;
; R0,R2 will be garbaged.
; FPPTR will be updated
;
RFORCE: MOV R3,-(SP) ;save registers
MOV R4,-(SP)
MOV R1,-(SP)
MOV (R1),R1 ;now R1 has address instead of address of address
MOV #10.,R2 ;READ 10 SETS OF DATA
SETLP: MOV #9.,R3 ;EIGHT STRAIN GAGES IN ALL+REF CHAN
MOV #30,R4 ;FIRST STRAIN GAGE CHANNEL
REDLP: MOVB R4,ADCCHN ;START CONVERTING STRAIN GAGE READING
WLP: TSTB ADCSR ;WAIT TILL CONVERSION COMPLETED
BMI CNVDNE
BR WLP
CNVDNE: MOV ADCVAL,R0 ;GET READING FROM BLUE INTERFACE
; ADD #2048.,R0
MOV R0,(R1)+ ;SAVE READING
INC R4 ;POINT TO NEXT CHANNEL
SOB R3,REDLP ;REPEAT UNTIL DONE
CLR -2(R1) ;NO REFERENCE READING
SOB R2,SETLP ;DO IT 10. TIMES
MOV (SP)+,R0 ;now update the pointer value
MOV R1,(R0)
MOV (SP)+,R4 ;retrieve registers
MOV (SP)+,R3
RTS PC